package org.alvin.i18n.ui;
 
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
 
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.stream.Collectors;
 
/**
 * Pinyin4j 工具类
 *
 * @author: wangjing
 * @createTime: 2023-11-27 11:11
 * @version:
 * @Description:
 */
public class Pinyin4jUtil2 {
 
    /**
     * 汉字转拼音(多音字)+首字母
     *
     * @param chinese 汉字
     * @return 拼音
     */
    /**
     * 汉字转汉语拼音
     *
     * @param text            汉语文本
     * @param pinyinCaseType  设置拼音大小写：UPPERCASE（大写）、LOWERCASE（小写）
     * @param pinyinToneType  设置拼音音调：WITHOUT_TONE（无音标）、WITH_TONE_MARK（拼音上面带音标）、WITH_TONE_NUMBER（用1-4表示音调）
     * @param pinyinVCharType 设置特殊音标ü：WITH_V（用 v 表示 ü）、WITH_U_AND_COLON（用 "u:" 表示 ü）、WITH_U_UNICODE（直接用 ü）
     *                        注意：toneType 为 WITH_TONE_MARK 时，charType 必须为 WITH_U_UNICODE，否则异常。
     * @return
     */
    public static List<String> textToHanYuPinyin(String text, HanyuPinyinCaseType pinyinCaseType,
                                                 HanyuPinyinToneType pinyinToneType,
                                                 HanyuPinyinVCharType pinyinVCharType) {
        //将汉字参数去除空格后转化为数组
        char[] textChar = text.trim().toCharArray();
        // 拼音格式配置
        HanyuPinyinOutputFormat hanyuPinyinOutputFormat = new HanyuPinyinOutputFormat();
        hanyuPinyinOutputFormat.setCaseType(pinyinCaseType);
        hanyuPinyinOutputFormat.setToneType(pinyinToneType);
        // toneType 为 WITH_TONE_MARK 时，charType 必须为 WITH_U_UNICODE，否则异常。
        if (pinyinToneType.equals(HanyuPinyinToneType.WITH_TONE_MARK)) {
            pinyinVCharType = HanyuPinyinVCharType.WITH_U_UNICODE;
        }
        hanyuPinyinOutputFormat.setVCharType(pinyinVCharType);
 
        ArrayList<StringBuilder> sbs = new ArrayList<>();
        ArrayList<StringBuilder> shortSbs = new ArrayList<>();
        sbs.add(new StringBuilder());
        HashSet<String> set = new HashSet<>();
        try {
            for (char value : textChar) {
                ArrayList<StringBuilder> builders = new ArrayList<>(sbs);
                sbs.clear();
                shortSbs.clear();
                //判断是否是汉字
                if (Character.toString(value).matches("[\\u4E00-\\u9FA5]+")) {
                    //如果是多音字，返回多个拼音的数组
                    String[] pys = PinyinHelper.toHanyuPinyinStringArray(value, hanyuPinyinOutputFormat);
                    for (String py : pys) {
                        for (StringBuilder builder : builders) {
                            StringBuilder stringBuilder = new StringBuilder(builder);
                            stringBuilder.append(py);
                            if (!set.contains(stringBuilder.toString())) {
                                sbs.add(stringBuilder);
                                set.add(stringBuilder.toString());
                            }
                        }
                    }
                }
            }
 
        } catch (BadHanyuPinyinOutputFormatCombination badHanyuPinyinOutputFormatCombination) {
            badHanyuPinyinOutputFormatCombination.printStackTrace();
        }
        return sbs.stream().map(StringBuilder::toString).collect(Collectors.toList());
    }
 
    public static void main(String[] args) {
        List<String> list = textToHanYuPinyin("我在重庆", HanyuPinyinCaseType.LOWERCASE, HanyuPinyinToneType.WITHOUT_TONE,
                HanyuPinyinVCharType.WITH_U_AND_COLON);
        for (String str : list) {
            System.out.println(str);
        }
    }
 
}